package br.edu.ufcg.p1.barzin.dialog;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import android.app.AlertDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import br.edu.ufcg.p1.barzin.App;
import br.edu.ufcg.p1.barzin.R;
import br.edu.ufcg.p1.barzin.async.AlteraPedidoTask;
import br.edu.ufcg.p1.barzin.gui.PessoaCheckBox;
import br.edu.ufcg.p1.barzin.model.Item;
import br.edu.ufcg.p1.barzin.model.Pedido;
import br.edu.ufcg.p1.barzin.model.Pessoa;

public class EditaPedidosDialogFragment extends DialogFragment {

	private View view;
	private Item item;
	private Pedido pedido;

	public EditaPedidosDialogFragment(View v, Pedido p) {
		this.view = v;
		this.pedido = p;
		this.item = p.getItem();
	}

	@Override
	public Dialog onCreateDialog(Bundle savedInstanceState) {
		this.setUpGUI();
		return new AlertDialog.Builder(getActivity())
				.setIcon(android.R.drawable.ic_dialog_alert).setView(view)
				.create();
	}

	private void modificaCheckBoxes(TableLayout grid, boolean novoEstado) {
		for (int j = 0; j < grid.getChildCount(); j++) {
			TableRow tr = (TableRow) grid.getChildAt(j);
			for (int k = 0; k < tr.getChildCount(); k++) {
				CheckBox cb = (CheckBox) tr.getChildAt(k);
				cb.setChecked(novoEstado);
			}
		}
	}

	private void calculaEAtualizaValorParcela(int qntPessoas) {
		if (qntPessoas > 0) {
			double total = Double
					.parseDouble(((TextView) view
							.findViewById(R.id.editarPedidoTotal)).getText()
							.toString().replace(",", "."));
			double parcela = Double.parseDouble(((TextView) view
					.findViewById(R.id.editarPedidoParcela)).getText()
					.toString().replace(",", "."));
			parcela = total / qntPessoas;
			parcela = Math.round(parcela * 100.0) / 100.0;

			DecimalFormat df = new DecimalFormat("0.00");
			String valor = df.format(parcela).replace(".", ",");

			((TextView) view.findViewById(R.id.editarPedidoParcela))
					.setText(valor);
		}
	}

	private List<Pessoa> getPessoasChecked(TableLayout grid) {
		List<Pessoa> pessoas = new ArrayList<Pessoa>();

		for (int j = 0; j < grid.getChildCount(); j++) {
			TableRow tr = (TableRow) grid.getChildAt(j);
			for (int k = 0; k < tr.getChildCount(); k++) {
				PessoaCheckBox cb = (PessoaCheckBox) tr.getChildAt(k);
				if (cb.isChecked()) {
					pessoas.add(cb.getPessoa());
				}
			}
		}

		return pessoas;
	}

	private void setUpBotoesFinais() {
		((Button) this.view.findViewById(R.id.editarPedidoBotaoFechar))
				.setOnClickListener(new OnClickListener() {
//					@Override
					public void onClick(View v) {
						dismiss();
					}
				});

		((Button) this.view.findViewById(R.id.editarPedidoBotaoSalvar))
				.setOnClickListener(new OnClickListener() {
//					@Override
					public void onClick(View v) {

						int qnt = Integer.parseInt(((TextView) view
								.findViewById(R.id.editarPedidoQnt)).getText()
								.toString());

						if (qnt == 0) {
							Toast.makeText(getActivity(),
									"Necessario pedir pelo menos um",
									Toast.LENGTH_LONG).show();
							return;
						}

						TableLayout grid = (TableLayout) view
								.findViewById(R.id.editarPedidosTableLayout);
						List<Pessoa> totalPessoas = getPessoasChecked(grid);

						if (totalPessoas.isEmpty()) {
							Toast.makeText(getActivity(),
									"Necessario marcar pelo menos uma pessoa",
									Toast.LENGTH_LONG).show();
						} else {

							pedido.setPessoas(totalPessoas);
							pedido.setQuantidade(qnt);

							new AlteraPedidoTask().execute(pedido);

							Toast.makeText(getActivity(), "Pedido Alterado",
									Toast.LENGTH_LONG).show();

							dismiss();
						}
					}
				});
	}

	private void populaTableLayout() {
		TableLayout grid = (TableLayout) this.view
				.findViewById(R.id.editarPedidosTableLayout);

		List<Pessoa> pessoas = App.environment().getDao().recuperaPessoas();

		TableRow tr = new TableRow(getActivity());
		tr.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
				LayoutParams.WRAP_CONTENT));

		int i = 0;
		for (Pessoa pessoa : pessoas) {
			PessoaCheckBox cb = new PessoaCheckBox(getActivity(), pessoa);
			if (pedido.getPessoas().contains(pessoa)) {
				cb.setChecked(true);
			}
			cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
//				@Override
				public void onCheckedChanged(CompoundButton buttonView,
						boolean isChecked) {
					TableLayout grid = (TableLayout) view
							.findViewById(R.id.editarPedidosTableLayout);
					List<Pessoa> totalPessoas = getPessoasChecked(grid);

					if (!totalPessoas.isEmpty()) {
						calculaEAtualizaValorParcela(totalPessoas.size());
					} else {
						((TextView) view.findViewById(R.id.editarPedidoParcela))
								.setText("0,00");
					}
				}
			});

			tr.addView(cb);

			i++;
			if (i == 3) {
				i = 0;
				grid.addView(tr);
				tr = new TableRow(getActivity());

			}
		}
		if (i != 0) {
			grid.addView(tr);
		}
	}

	private void atualizaQuantidade(int qnt) {
		((TextView) this.view.findViewById(R.id.editarPedidoQnt)).setText(qnt
				+ "");

		double total = Double.parseDouble(((TextView) this.view
				.findViewById(R.id.editarPedidoTotal)).getText().toString().replace(",", "."));
		total = qnt * item.getPreco();
		total = Math.round(total * 100.0) / 100.0;

		DecimalFormat df = new DecimalFormat("0.00");
		String valor = df.format(total).replace(".", ",");

		((TextView) this.view.findViewById(R.id.editarPedidoTotal))
				.setText(valor);

		TableLayout grid = (TableLayout) this.view
				.findViewById(R.id.editarPedidosTableLayout);
		List<Pessoa> totalPessoas = getPessoasChecked(grid);

		if (!totalPessoas.isEmpty()) {
			calculaEAtualizaValorParcela(totalPessoas.size());
		} else {
			((TextView) this.view.findViewById(R.id.editarPedidoParcela))
					.setText("0,00");
		}
	}

	private void setUpGUI() {
		((TextView) this.view.findViewById(R.id.editarPedidoItemNome))
				.setText(item.getNome());
		((TextView) this.view.findViewById(R.id.editarPedidoItemNome))
				.setTextSize(38);
		((TextView) this.view.findViewById(R.id.editarPedidoItemStatus))
				.setText(pedido.getEstado());
		((TextView) this.view.findViewById(R.id.editarPedidoItemPreco))
				.setText("R$ " + item.getPrecoFormatado() + "");
		((TextView) this.view.findViewById(R.id.editarPedidoQnt))
				.setText(pedido.getQuantidade() + "");

		((TextView) this.view.findViewById(R.id.editarPedidoItemPreco))
				.setTextSize(38);
		((TextView) this.view.findViewById(R.id.editarPedidoItemStatus))
				.setTextSize(28);

		if (pedido.getEstado().equals("Pendente")) {
			((TextView) this.view.findViewById(R.id.editarPedidoItemStatus))
					.setTextColor(0xFFFFD700);
		} else {
			((TextView) this.view.findViewById(R.id.editarPedidoItemStatus))
					.setTextColor(0xFF529800);
		}

		((TextView) this.view.findViewById(R.id.editarPedidoQnt))
				.setTextSize(28);

		double total = pedido.getQuantidade() * item.getPreco();
		total = Math.round(total * 100.0) / 100.0;
		
		DecimalFormat df = new DecimalFormat("0.00");
		String valor = df.format(total).replace(".", ",");
		
		((TextView) this.view.findViewById(R.id.editarPedidoTotal))
				.setText(valor);

		calculaEAtualizaValorParcela(pedido.getPessoas().size());
		populaTableLayout();
		setUpBotoesFinais();

		((Button) this.view.findViewById(R.id.editarPedidoBotaoMarcarTodos))
				.setOnClickListener(new OnClickListener() {
//					@Override
					public void onClick(View v) {
						TableLayout grid = (TableLayout) view
								.findViewById(R.id.editarPedidosTableLayout);
						modificaCheckBoxes(grid, true);
						calculaEAtualizaValorParcela(getPessoasChecked(grid)
								.size());
					}

				});

		((Button) this.view.findViewById(R.id.editarPedidoBotaoDesmarcar))
				.setOnClickListener(new OnClickListener() {
//					@Override
					public void onClick(View v) {
						TableLayout grid = (TableLayout) view
								.findViewById(R.id.editarPedidosTableLayout);
						modificaCheckBoxes(grid, false);
						((TextView) view.findViewById(R.id.editarPedidoParcela))
								.setText("0,00");
					}
				});

		((ImageView) this.view.findViewById(R.id.editarPedidoFotoImg))
				.setImageBitmap(item.getFoto());

		if (!pedido.isRecebido()) {

			((ImageView) this.view.findViewById(R.id.editarPedidoAddQnt))
					.setVisibility(View.VISIBLE);
			((ImageView) this.view.findViewById(R.id.editarPedidoAddQnt))
					.setOnClickListener(new OnClickListener() {
//						@Override
						public void onClick(View v) {
							int qnt = Integer.parseInt(((TextView) view
									.findViewById(R.id.editarPedidoQnt))
									.getText().toString());
							qnt++;
							atualizaQuantidade(qnt);
						}

					});

			((ImageView) this.view.findViewById(R.id.editarPedidoDelQnt))
					.setVisibility(View.VISIBLE);
			((ImageView) this.view.findViewById(R.id.editarPedidoDelQnt))
					.setOnClickListener(new OnClickListener() {
//						@Override
						public void onClick(View v) {
							int qnt = Integer.parseInt(((TextView) view
									.findViewById(R.id.editarPedidoQnt))
									.getText().toString());
							if (qnt != 0) {
								qnt--;
								atualizaQuantidade(qnt);
							}
						}
					});

		}
	}

}